package com.cn.common.utils;


import com.auth0.jwt.JWT;
import com.auth0.jwt.interfaces.DecodedJWT;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.SignatureException;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.HashMap;
import java.util.UUID;

public class JwtUtils {
    //指定一个token过期时间（毫秒）
    private static final long EXPIRE_TIME = 7 * 24 * 60 * 60 * 1000; //7天
//    static SecretKey secretKey = Keys.secretKeyFor(SignatureAlgorithm.HS256);
    public static final String secretKey = "123456";


    /**
     * 生成管理员token
     * 注意这里的sercet不是密码，而是进行三件套（salt+MD5+1024Hash）处理密码后得到的凭证
     * 这里为什么要这么做，在controller中进行说明
     */
    public static String getJwtToken(String username,String password,String role) throws UnsupportedEncodingException {
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        HashMap<String, String> map = new HashMap<>();
        map.put("password",password);
        map.put("username",username);
        map.put("role","admin");
        // 附带username信息的token
        return Jwts.builder()
                .setSubject("admin")
                .setClaims(map)
                .setExpiration(date)
                .setId(UUID.randomUUID().toString())
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
    }
    /**
    * 生成游客token
    * */
    public static String getJwtTokenForGuest() throws UnsupportedEncodingException {
        Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
        HashMap<String, String> map = new HashMap<>();
        // 游客的默认信息，可以根据需要进行调整
        map.put("role", "guest");

        // 附带游客信息的token
        return Jwts.builder()
                .setSubject("guest") // 可以将用户名设置为"guest"或其他标识
                .setClaims(map)
                .setExpiration(date)
                .setId(UUID.randomUUID().toString())
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
    }
    /**
     * 校验token是否正确
     */
    public static Claims verifyToken(String token) {
        try {
            return Jwts.parser()
                    .setSigningKey(secretKey)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (ExpiredJwtException ex) {
            // Token已过期
            System.err.println("Token已过期: " + ex.getMessage());
        } catch (SignatureException ex) {
            // Token签名无效
            System.err.println("无效的Token签名: " + ex.getMessage());
        } catch (MalformedJwtException ex) {
            // Token格式错误
            System.err.println("无效的Token格式: " + ex.getMessage());
        } catch (Exception ex) {
            // 其他异常
            System.err.println("Token验证失败: " + ex.getMessage());
        }
        return null;
    }

    /**
     * 判断是否过期
     */
    public static boolean isExpire(String token) {
        DecodedJWT jwt = JWT.decode(token);
        return jwt.getExpiresAt().getTime() < System.currentTimeMillis();
    }
}
